package com.proyecto.core.vista.echo.componentes;

import java.util.List;

import nextapp.echo2.app.SelectField;
import nextapp.echo2.app.list.DefaultListModel;
import nextapp.echo2.app.list.ListModel;

import com.proyecto.core.Utilidades.UtilConversion;
import com.proyecto.core.Utilidades.UtilReflect;
import com.proyecto.core.modelo.echo.constantes.TipoBusqueda;
import com.proyecto.core.modelo.excepciones.GeneralException;
import com.proyecto.core.modelo.servicio.interfaces.IServicioTransaccion;
import com.proyecto.core.vista.echo.localizador.ServiceLocator;

import echopointng.SelectFieldEx;

public abstract class UtilSelectField {

	/**
	 * 
	 * @param pSelecfFieldCampo
	 * @param pCiaOpr
	 * @param pAtributoaMostrar
	 * @param pAtributoClave
	 * @param pServicio
	 * @param pServiceLocator
	 */
	static final public void cargarSelectField(SelectFieldEx  pSelecfFieldCampo,
 											   String         pCiaOpr,
 											   String         pAtributoaMostrar,
											   String         pAtributoClave   ,
											   String         pServicio        ,
											   ServiceLocator pServiceLocator){
		IServicioTransaccion servicio = (IServicioTransaccion) pServiceLocator.getBean(pServicio);
		DefaultListModel dlm = new DefaultListModel();
		pSelecfFieldCampo.setModel(dlm);
		try {
			List lista =  servicio.consultarTodos(pCiaOpr);
			for(int i = 0 ; i<lista.size(); i++){
				Object objetoDTOCmb = lista.get(i);
				try {
					String nombre = (String) UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoaMostrar,new Class[] {});
					Object clave  = UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoClave,new Class[] {});
					dlm.add( nombre);
					pSelecfFieldCampo.setAttribute((String) nombre, clave);
				} catch (Exception e) {
//					TODO: handle exception
					e.printStackTrace();
				}
			}
		}  catch (GeneralException e) {
			if(e.getClaveMensaje().indexOf("consultaVacia") < 0)
			{
//				TODO; Se debe manejar aqui la excepci�n cuando no sea vacio
//				da un error distinto, puede ser comunicacion etc.
//				try{
//				mensaje = mensajeError.getString(e.getClaveMensaje());
//				}catch (Exception e1) {
//				mensaje = mensaje + e.getClaveMensaje();
//				System.out.println(e.getClaveMensaje());
//				}
//				DialogoMensajes m = new DialogoMensajes("Error",mensaje, MensajeTipo.ALERTA);
//				if (this.getParent()!=null){
//				this.getParent().add(m);	
//				}
			}
		}
	}
	
	/**
	 * 
	 * @param pSelecfFieldCampo
	 * @param pCiaOpr
	 * @param pValorPorDefecto
	 * @param pAtributoClave
	 * @param pServicio
	 * @param pServiceLocator
	 */
	static final public void cargarSelectField(SelectField    pSelecfFieldCampo,
											   String         pCiaOpr          ,
											   String         pValorPorDefecto,
											   String         pAtributoClave   ,
											   String         pServicio        ,
											   ServiceLocator pServiceLocator){
		IServicioTransaccion servicio = (IServicioTransaccion) pServiceLocator.getBean(pServicio);
		DefaultListModel dlm = new DefaultListModel();
		pSelecfFieldCampo.setModel(dlm);
		try {
			String valor = null;
			List lista =  servicio.consultarTodos(pCiaOpr);
			for(int i = 0 ; i<lista.size(); i++){
				Object objetoDTOCmb = lista.get(i);
				try {
					Object clave  = UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoClave,new Class[] {});
					if (pValorPorDefecto.length() > 0)
						valor = (String) UtilReflect.invocarMetodoGet(objetoDTOCmb,pValorPorDefecto,new Class[] {});
					dlm.add( clave);
					if (UtilConversion.caracteraLogico(valor)){ // si es valor por defecto
						pSelecfFieldCampo.setSelectedItem(clave);
					}
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}  catch (GeneralException e) {
			if(e.getClaveMensaje().indexOf("consultaVacia") < 0)
			{
				//TODO; Se debe manejar aqui la excepci�n cuando no sea vacio
				// da un error distinto, puede ser comunicacion etc.
//				try{
//					mensaje = mensajeError.getString(e.getClaveMensaje());
//				}catch (Exception e1) {
//					mensaje = mensaje + e.getClaveMensaje();
//					System.out.println(e.getClaveMensaje());
//				}
//				DialogoMensajes m = new DialogoMensajes("Error",mensaje, MensajeTipo.ALERTA);
//				if (this.getParent()!=null){
//					this.getParent().add(m);	
//				}
			}
		}
	}
	
	
	static final public void cargarSelectFieldFiltroExtra(SelectField    pSelecfFieldCampo,
											   String         pCiaOpr          ,
											   String         pValorPorDefecto,
											   String         pAtributoClave   ,
											   String[]       pAtributoFiltro  ,
											   Object[]       pValorAtributoFiltro  ,
											   String         pServicio        ,
											   ServiceLocator pServiceLocator){
		IServicioTransaccion servicio = (IServicioTransaccion) pServiceLocator.getBean(pServicio);
		DefaultListModel dlm = new DefaultListModel();
		pSelecfFieldCampo.setModel(dlm);
		try {
			String valor = null;
			//List lista =  servicio.consultarTodos(pCiaOpr);
			String[] atributo = pAtributoFiltro;
			Object[] valorFiltro= pValorAtributoFiltro;
			List lista =  servicio.buscarCatalogoPorPropiedad(atributo, valorFiltro, TipoBusqueda.OPE_IGUAL, true);// consultarTodos(pCiaOpr);
			System.out.println("lista.size():: " +lista.size());
			for(int i = 0 ; i<lista.size(); i++){
				Object objetoDTOCmb = lista.get(i);
				try {
					Object clave  = UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoClave,new Class[] {});
					if (pValorPorDefecto.length() > 0)
						valor = (String) UtilReflect.invocarMetodoGet(objetoDTOCmb,pValorPorDefecto,new Class[] {});
					dlm.add( clave);
					if (UtilConversion.caracteraLogico(valor)){ // si es valor por defecto
						pSelecfFieldCampo.setSelectedItem(clave);
					}
				} catch (Exception e) {
					// TODO: handle exception
					e.printStackTrace();
				}
			}
		}  catch (GeneralException e) {
			if(e.getClaveMensaje().indexOf("consultaVacia") < 0)
			{
				//TODO; Se debe manejar aqui la excepci�n cuando no sea vacio
				// da un error distinto, puede ser comunicacion etc.
//				try{
//					mensaje = mensajeError.getString(e.getClaveMensaje());
//				}catch (Exception e1) {
//					mensaje = mensaje + e.getClaveMensaje();
//					System.out.println(e.getClaveMensaje());
//				}
//				DialogoMensajes m = new DialogoMensajes("Error",mensaje, MensajeTipo.ALERTA);
//				if (this.getParent()!=null){
//					this.getParent().add(m);	
//				}
			}
		}
	}
	
	static final public void cargarSelectField(SelectField sf, List<Object> listaPojo,  String etiqueta){
		DefaultListModel dlm = new DefaultListModel();
		sf.setModel(dlm);
		for(int i = 0 ; i<listaPojo.size(); i++){
			Object objetoDTOCmb = listaPojo.get(i);
			try {
				String nombre = (String) UtilReflect.invocarMetodoGet(objetoDTOCmb,etiqueta,new Class[] {});
				dlm.add(nombre);
				sf.setProperty(nombre,objetoDTOCmb);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	/** Este metodo carga un SelectField con un arreglo de Etiquetas (Eqtiqueta) y el valor clave correspondientes a la etiqueta 
	 * es almacenado en el atributo ActionCommand del SlectField separado con el caracter "|". Los valores del arrelgo etiqueta 
	 * deben corresponder uno a uno con los valores del arreglo Valor  
	 * @param pSelecfField
	 * @param Eqtiqueta
	 * @param Valor
	 */
	static final public void cargarSelectField(SelectField    pSelecfField,
			   String[] etiquetas,
			   String[] valores){
		String valoresClaves = "";
		
		DefaultListModel dlm = new DefaultListModel();
		pSelecfField.setModel(dlm);
		pSelecfField.setActionCommand("");
		for (int i = 0; i < etiquetas.length; i++) {
			dlm.add(etiquetas[i]);
			valoresClaves = valoresClaves + valores[i] + "|";
		}
		pSelecfField.setActionCommand(valoresClaves);
	}
	
	/** Este metodo carga un SelectField con un arreglo de Etiquetas (Eqtiqueta) y el valor clave correspondientes a la etiqueta 
	 * es almacenado en el atributo ActionCommand del SlectField separado con el caracter "|". Los valores del arrelgo etiqueta 
	 * deben corresponder uno a uno con los valores del arreglo Valor  
	 * @param pSelecfField
	 * @param Eqtiqueta
	 * @param Valor
	 */
	static final public void cargarSelectField(SelectField    pSelecfField,
			   String[] etiquetas,
			   Integer[] valores){
		String valoresClaves = "";
		
		DefaultListModel dlm = new DefaultListModel();
		pSelecfField.setModel(dlm);
		pSelecfField.setActionCommand("");
		for (int i = 0; i < etiquetas.length; i++) {
			dlm.add(etiquetas[i]);
			valoresClaves = valoresClaves + valores[i] + "|";
		}
		pSelecfField.setActionCommand(valoresClaves);
	}

	/**
	 * 
	 * @param pSelecfFieldCampo			Campo u Objeto Combo para Introducir valores
	 * @param pCiaOpr					Atributo Ciaopr
	 * @param pAtributoaMostrar			Atribuno que se mostrara en el Combo
	 * @param pAtributoClave			Atributo clave que se almacenara en la BD
	 * @param pAtributoFiltro			Atributo Filtros
	 * @param pValorAtributoFiltro		Datos relacionados con el atributo filtro
	 * @param pServicio					Archivo de Servicio
	 * @param pServiceLocator			Locator de Servicio
	 */
	static final public void cargarSelectField_CombosDatos(SelectFieldEx  pSelecfFieldCampo,
			   												String         pCiaOpr,
			   												String         pAtributoaMostrar,
			   												String         pAtributoClave   ,
			   												String[]       pAtributoFiltro ,
			 											   	Object[]       pValorAtributoFiltro  ,
			   												String         pServicio        ,
			   												ServiceLocator pServiceLocator
			){
			IServicioTransaccion servicio = (IServicioTransaccion) pServiceLocator.getBean(pServicio);
			DefaultListModel dlm = new DefaultListModel();
			pSelecfFieldCampo.setModel(dlm);
			try {

				String[] atributo = pAtributoFiltro;
				Object[] valorFiltro= pValorAtributoFiltro;
				
				List lista =  servicio.buscarCatalogoPorPropiedad(atributo, valorFiltro, TipoBusqueda.OPE_IGUAL, true);// consultarTodos(pCiaOpr);
				for(int i = 0 ; i<lista.size(); i++){
					Object objetoDTOCmb = lista.get(i);
					try {
						String nombre = (String) UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoaMostrar,new Class[] {});
						Object clave  = UtilReflect.invocarMetodoGet(objetoDTOCmb,pAtributoClave,new Class[] {});
						dlm.add( nombre);
						pSelecfFieldCampo.setAttribute((String) nombre, clave);
					} catch (Exception e) {
						//	TODO: handle exception
						e.printStackTrace();
					}
				}
			}  catch (GeneralException e) {
				if(e.getClaveMensaje().indexOf("consultaVacia") < 0)
				{
				}
			}
	}

}
